package com.topdt.jbpm.utils;

import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.thx.common.spring.BeanFactory;
import com.topdt.jbpm.identity.IdFactory;
import com.topdt.jbpm.identity.IdentityService;
import com.topdt.jbpm.identity.Role;
import com.topdt.jbpm.model.Activity;
import com.topdt.jbpm.service.Context;
import com.topdt.jbpm.service.FormInstanceManager;


/**  
 *  @Project       : saasoa
 *  @Program Name  : com.topdt.jbpm.utils.DecisionBranchUtil.java
 *  @Class Name    : DecisionBranchUtil
 *  @Description   : 决定节点的分支自动判断工具,封装了流程自动流转的业务规则
 *  @Author        : calonlan
 *  @Creation Date : 2014年12月18日 下午5:22:28 
 *  @ModificationHistory  
 *  Who        When          What 
 *  --------   ----------    -----------------------------------
 *  username   2014年12月18日       TODO
 */
public class DecisionBranchUtil {
	
	//循环决定节点的所有向前流转，根据业务规则自动判断执行
	//数字区间业务关键字段,例如:day
	private String key = null;
	//业务关键字段在表单的值
	private String val = null;
	//分支返回的结果
	private boolean result = false;
	//数量标识
	private boolean numFlag = false;
	//角色标识
	private boolean roleFlag = false;
	private List<Role> roles = null;
			
	
	/** 
	 *  @Description    : 分支是否匹配流程实例的业务规则
	 *  @Method_Name    : isBranchMatch
	 *  @param a			Activity
	 *  @param context		Context
	 *  @return 			
	 *  @return         : boolean
	 *  @Creation Date  : 2014年12月18日 下午5:22:33 
	 *  @version        : v1.00
	 *  @Author         : calonlan
	 
	 *  @Update Date    : 
	 *  @Update Author  : 
	 */
	public boolean isBranchMatch(Activity a, Context context) {
		//wangxufeng edit 20141222 处理null
		String str = a.getDesc()==null?"":a.getDesc();
		//去除空白
		str = str.replaceAll("\\s*", "");
		
    	System.out.println("str:"+str);
    	if(str != null && str.length() > 0) {
    		String[] arr = str.split(":");
    		//决定类型:数字区间
    		if("num".equals(arr[0])) {
    			if(!numFlag) {
    				
    	    		//匹配关键字
    		    	Pattern p = Pattern.compile("[A-Za-z]+");
    		        Matcher m = p.matcher(arr[1]);
    		        if(m.find()) {
    		        	key = m.group();
    		        }
    		        //获取关键字段在表单的值
    		        FormInstanceManager formInstanceManager = (FormInstanceManager) BeanFactory.getBean(FormInstanceManager.class);
    				Map<String, String> data = formInstanceManager.getDataById(context.getWorkId());
    				val = data.get(key);
    				numFlag = true;
    	    	}
    	    	
    			//匹配
//    	        boolean flag = MatchUtil.intervalMatch(key, Float.valueOf(val),str);
    	    	result = LogicalUtil.parse(Float.valueOf(val), key, arr[1]);
    		//决定类型:角色区间	
    		} else if("role".equals(arr[0])) {
    			
    			if(!roleFlag) {
    				IdentityService identityService = IdFactory.getIdentityServiceFactory().getIdentityService();
	    			roles = identityService.getRolesOfUser(context.getCurrentActor());
    				roleFlag = true;
    			}
    			result = roleMatch(roles, arr[1]);
    		}
    	}
		return result;
	}
	
	
	/** 
	 *  @Description    : 分支角色表达式与用户拥有角色多对多匹配
	 *  @Method_Name    : roleMatch
	 *  @param roles	用户拥有角色
	 *  @param roleExp	分支角色表达式
	 *  @return 
	 *  @return         : boolean
	 *  @Creation Date  : 2014年12月18日 下午4:00:54 
	 *  @version        : v1.00
	 *  @Author         : calonlan
	 
	 *  @Update Date    : 
	 *  @Update Author  : 
	 */
	private boolean roleMatch(List<Role> roles, String roleExp) {
		String[] arr = roleExp.split("\\|");
		
		//角色包含
		if("in".equals(arr[0])) {
			for(String roleId : arr[1].split(",")) {
				for(Role role : roles) {
					if(roleId.equals(role.getId())) {
						return true;
					}	
				}
			}
			return false;
		//角色不包含
		} else if("notin".equals(arr[0])) {
			for(String roleId : arr[1].split(",")) {
				for(Role role : roles) {
					if(roleId.equals(role.getId())) {
						return false;
					}	
				}
			}
			return true;
		}
		
		return false;
	}
}
